<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>AutoPatchWork</title>
<link href="option_page.css" rel="stylesheet" type="text/css">
<script type="text/javascript" src="x.js"></script>
<script type="text/javascript" src="tween2.js"></script>
<body>
<ul class="tabs" id="menu_tabs">
	<li class="basics"><a href="#basics" class="active"><span>Basics</span></a>
	<li class="filters"><a href="#filters"><span>Filters</span></a>
	<li class="styles"><a href="#styles"><span>Styles</span></a>
	<li class="news"><a href="#news"><span>News</span></a>
	<li class="about"><a href="#about"><span>About</span></a>
</ul>
<div id="container">
<div id="inner_container">
<section id="basics" class="content">
	<div class="buttons"><button id="update_siteinfo" class="MSG_update_siteinfo">Update SITEINFO</button><span id="update_siteinfo_output"></span></div>
	<div class="buttons"><button id="open_siteinfo_manager" class="MSG_open_siteinfo_manager">Open SITEINFO manager</button></div>
	<div><input type="checkbox" id="auto_start"><label for="auto_start" class="MSG_auto_start">auto start</label></div>
	<div><input type="checkbox" id="target_blank"><label for="target_blank" class="MSG_open_newtab">open new tabs from inserted links</label></div>
	<div><input type="checkbox" id="disable_iframe"><label for="disable_iframe" class="MSG_noiframe">not work FRAME</label></div>
	<div>
		<span class="mins">0</span>
		<input type="range" id="remain_height" max="2000" min="0" step="10">
		<span class="maxs">2000</span>
	</div>
	<div class="outputs">
		<label for="remain_height" class="MSG_remain_height">base remain height</label> <span class="outputs" id="remain_height_value"></span>
	</div>
	<div><input type="checkbox" id="debug_mode"><label for="debug_mode" class="MSG_debugmode">debug mode</label></div>
	<div>
		<h4 class="MSG_bottom_bar">status bar on page bottom</h4>
		<p><input type="radio" name="bar_status" id="bar_on" value="on"><label for="bar_on" class="MSG_bar_on">ON</label>
		<p><input type="radio" name="bar_status" id="bar_off" value="off"><label for="bar_off" class="MSG_bar_off">OFF</label>
	</div>
</section>
<section id="filters" class="content">
	<div class="MSG_exclude_filter">Exclude Filter by URL</div>
	<ul id="filter_list">
	</ul>
	<select id="filter_type">
		<option class="MSG_filter_prefix" value="prefix">prefix</option>
		<option class="MSG_filter_domain" value="domain">domain</option>
		<option class="MSG_filter_regexp" value="regexp">regexp</option>
	</select>
	<input type="text" id="filter_text" value="">
	<button id="add_filter" class="MSG_add">Add</button>
</section>
<section id="styles" class="content">
	<div class="MSG_separator_style">Page Separator Style</div>
	<textarea id="css_text"></textarea>
	<div><button id="apply_css" class="MSG_save">Save</button></div>
	<div><button id="reset_css" class="MSG_reset">Reset</button></div>
</section>
<section id="news" class="content">
	<ul>
	<li>
		<h4>2011/05/31 0:24</h4>
		<p>target=_blank指定でないとき、ブラウザの戻る使用した場合に、ページの継ぎ足しを復元するように変更。
	</li>
	<li>
		<h4>2011/05/15 19:21</h4>
		<p>Googleのインスタント検索対応。
		<p>(2011/05/15 23：37 追記) 追加でページナンバーのズレ修正、挿入位置のズレ修正。インスタント検索対応のアドバイス、バグ報告を頂いた<a href="https://twitter.com/mono0x">@mono0x</a>さんに感謝！
	</li>
	<li>
		<h4>2011/04/03 15:51</h4>
		<p>Safariユーザー向け：環境によって(トラックパッドで2本指スクロールしたときに)継ぎ足し時にスクロール位置がずれる問題を修正してみたつもりです。オプション周りの問題も後で修正します。
	</li>
	<li>
		<h4>2011/02/09 23:20</h4>
		<p>ページ下部のステータスバーの表示オプションを追加しました。スクロールが重く感じる場合、OFFにすると改善されるかもしれません。
	</li>
	<li>
		<h4>2011/02/04 01:35</h4>
		<p>SITEINFOに間違った正規表現があったときに処理が止まってしまうバグを修正しました。
	</li>
	<li>
		<h4>2010/10/24 12:43</h4>
		<p>Filtersが適用されないバグを修正しました。Thx <a href="http://twitter.com/syoichi/status/28557748256" target="_blank">@syoichi</a>!
	</li>
	<li>
		<h4>2010/10/24 1:53</h4>
		<ul>
		<li>Chrome本体の言語設定にあわせて、一部日本語化しました。
		<li>SITEINFOの管理機能を実装しました。
		<li>Tumblrで画像がきれいに表示されない問題に対応しました。
		<li>NAVERまとめに対応しました。
		</ul>
	</li>
	<li>
		<h4>2010/06/16 16:03</h4>
		<p>Yahoo対策(リダイレクトを挟むサイト対策)が一部のサイトに誤爆していたのを修正しました。</p>
	</li>
	<li>
		<h4>2010/06/15 17:24</h4>
		<p>新しいタブで開く指定が効いてなかったのを修正。また、新しいタブで開かないときは履歴に記録を残す(history.pushState)ことで、履歴で戻った際にクリックしたリンクのあるページに戻るように対策しました。ただ、スクロール位置がずれるのが課題です。</p>
	</li>
	<li>
		<h4>2010/06/15 14:27</h4>
		<p>Safari版に合わせて、ページの下にラインを表示するようにしました。これにより、フレームを使ったページでもON/OFFの制御が可能になりました。また、フッターを見たい時にOFFにしやすくなったと思います。</p>
		<p>適用しようとして失敗したSITEINFOを記録するようにしました。やはり、使ってないSITEINFOを無効にするためのデータとして使う予定です。</p>
	</li>
	<li>
		<h4>2010/02/18 2:57</h4>
		<p>Filterの定義の仕方を前方一致、ドメインの一致、正規表現の3つから選べるようにしました。</p>
		<p>SITEINFOを2日間キャッシュするようにしました。代わりに、siteinfoを更新するボタンをつけてあります(更新先をバックアップファイルにするか、wedataにするか迷いましたが、バックアップの方にしました)。</p>
		<p>実際に使用したSITEINFOを記録するようにしました。後で、自分が良く使うSITEINFOを一覧したり、使ってないSITEINFOを無効にしたりすることができるようにする予定です。</p>
	</li>
	<li>
		<h4>2010/01/12 20:34</h4>
		<p>base remain height(どこまでスクロールしたら次のページの読み込みするか決める変数)を設定できるようにしました。</p>
	</li>
	<li>
		<h4>2010/01/12 19:52</h4>
		<p>デバッグモードを追加しました。</p>
	</li>
	<li>
		<h4>2009/11/02 14:45</h4>
		<p>設定項目をいくつか追加しました。(ページ区切りの)スタイルをCSSでカスタマイズできるようにしました。</p>
	</li>
	<li>
		<h4>2009/10/23 12:08</h4>
		<p>Chrome 4.0.223.9で落ちるバグを修正しました。</p>
	</li>
	</ul>
</section>
<section id="about" class="content">
	<dl>
		<dt>Name:<dt>
		<dd><a href="http://code.google.com/p/autopatchwork/" target="_blank">AutoPatchWork</a></dd>
		<dt>Author:<dt>
		<dd><a href="http://ss-o.net/" target="_blank">os0x</a></dd>
		<dt>Thanks:<dt>
		<dd><a href="http://autopagerize.net/" target="_blank">AutoPagerize</a></dd>
		<dt>License:<dt>
		<dd><a href="http://creativecommons.org/licenses/MIT/" target="_blank">The MIT license</a></dd>
	</dl>
</section>
</div>
</div>
<script>
Object.keys || (Object.keys = function(k){
	var r = [];
	for (var i in k) r.push(i);
	return r;
});
(function option_init(opt){
var g = this;
if(this.chrome){
  BackGround = chrome.extension.getBackgroundPage();
  AutoPatchWork = BackGround.AutoPatchWork;
} else if (this.safari && !opt){
  safari.self.tab.dispatchMessage('option_init');
  safari.self.addEventListener('message',function(evt){
	if(evt.name === 'option_init'){
		option_init(evt.message);
	} else if(evt.name === 'updated_siteinfo') {
		BackGround.callback();
	}
  },false);
  return;
} else if (this.opera && !opt){
	opera.extension.onmessage = function(evt){
		if(evt.data.name === 'option_init'){
			option_init(evt.data.data);
		} else if(evt.data.name === 'updated_siteinfo') {
			BackGround.callback();
		}
	};
	opera.extension.postMessage({name:'option_init'});
	return;
} else if (opt && g.safari){
	AutoPatchWork = opt;
	['save_css','reset_css','add_disable_site','delete_disable_site'].forEach(function(action){
		AutoPatchWork[action] = function(){
			safari.self.tab.dispatchMessage('invoke_action',{action:action, args:Array.prototype.slice.call(arguments)});
		};
	});
	AutoPatchWork.update = function(){
		safari.self.tab.dispatchMessage('invoke_action',{action:'update', config:AutoPatchWork.config});
	};
	AutoPatchWork.save_disable_site = function(){
		safari.self.tab.dispatchMessage('invoke_action',{action:'save_disable_site', disable_sites:AutoPatchWork.disable_sites});
	};
	BackGround = {UpdateSiteinfo:function(callback){
		BackGround.callback = callback;
		safari.self.tab.dispatchMessage('invoke_action',{action:'UpdateSiteinfo'});
	}};
} else if (opt && g.opera){
	AutoPatchWork = opt;
	['save_css','reset_css','add_disable_site','delete_disable_site'].forEach(function(action){
		AutoPatchWork[action] = function(){
			opera.extension.postMessage({name:'invoke_action',data:{action:action, args:Array.prototype.slice.call(arguments)}});
		};
	});
	AutoPatchWork.update = function(){
		opera.extension.postMessage({name:'invoke_action',data:{action:'update', config:AutoPatchWork.config}});
	};
	AutoPatchWork.save_disable_site = function(){
		opera.extension.postMessage({name:'invoke_action',data:{action:'save_disable_site', disable_sites:AutoPatchWork.disable_sites}});
	};
	BackGround = {UpdateSiteinfo:function(callback){
		BackGround.callback = callback;
		opera.extension.postMessage({name:'invoke_action',data:{action:'UpdateSiteinfo'}});
	}};
}

var WIDTH = 800;
var HEIGHT = Math.max(window.innerHeight - 100, 500);

var i18n = this.chrome ? chrome.i18n:
           this.safari ? {
                           getAcceptLanguages:function(){},
                           getMessage:function(){}
                         }:
                         {
                           getAcceptLanguages:function(){},
                           getMessage:function(){}
                         };

function L10N(){
	i18n.getAcceptLanguages(function(langs){
		if (langs.indexOf('ja') < 0 ) {
			document.querySelector('#menu_tabs > li.news').style.display = 'none';
		}
	});
	var elems = document.querySelectorAll('*[class^="MSG_"]');
	Array.prototype.forEach.call(elems, function(node){
		var key = node.className.match(/MSG_(\w+)/)[1];
		var message = i18n.getMessage(key);
		if (message) node.textContent = message;
	});
}
L10N();


var open_siteinfo_manager = document.getElementById('open_siteinfo_manager');
open_siteinfo_manager.addEventListener('click',function(e){
	if(window.chrome) {
		window.chrome.tabs.getCurrent(function(tab){
			chrome.tabs.update(tab.id,{url:"siteinfo_manager.html"});
		});
	} else if(window.safari){
		safari.self.tab.dispatchMessage('options', {manage:true});
	} else if(window.opera){
		opera.extension.postMessage({name:'options', data:{manage:true}});
	}
},false);

var update_siteinfo = document.getElementById('update_siteinfo');
var update_siteinfo_output = document.getElementById('update_siteinfo_output');
update_siteinfo.addEventListener('click',function(e){
	update_siteinfo.disabled = true;
	update_siteinfo_output.textContent = 'loading';
	BackGround.UpdateSiteinfo(function(){
		update_siteinfo_output.textContent = 'success';
		update_siteinfo.disabled = false;
	},function(){
		update_siteinfo_output.textContent = 'sorry, something wrong.';
	})
},false);

$X('//input[@type="radio"]').forEach(function(box){
	var id = box.id;
	var name = box.name;
	var val = AutoPatchWork.config[name] || 'on';
	if (val == box.value) {
		box.checked = true;
	} else {
	}
	box.addEventListener('click',function(){
		AutoPatchWork.config[name] = box.value;
		AutoPatchWork.update();
	},false);
});
$X('/html/body/div/div/section/div/input[@type="checkbox"]').forEach(function(box){
	var id = box.id;
	var val = AutoPatchWork.config[id];
	if (val === true || val === false) {
		box.checked = val;
	} else {
		//return;
	}
	box.addEventListener('click',function(){
		if (box.checked) {
			AutoPatchWork.config[id] = true;
		} else {
			AutoPatchWork.config[id] = false;
		}
		AutoPatchWork.update();
	},false);
});
$X('/html/body/div/div/section/div/input[@type="range"]').forEach(function(box){
	var id = box.id;
	var output = document.querySelector('#' + id + '_value');
	var val = AutoPatchWork.config[id];
	box.value = val;
	output.textContent = box.value;
	box.addEventListener('change',function(){
		AutoPatchWork.config[id] = +this.value;
		output.textContent = box.value;
		AutoPatchWork.update();
	},false);
});

var css_text = document.getElementById('css_text');
css_text.value = AutoPatchWork.css;
var apply_css = document.getElementById('apply_css');
apply_css.addEventListener('click',function(){
	AutoPatchWork.save_css(css_text.value);
},false);

var reset_css = document.getElementById('reset_css');
reset_css.addEventListener('click',function(){
	AutoPatchWork.reset_css();
	setTimeout(function(){
		css_text.value = AutoPatchWork.css = localStorage.AutoPatchWorkCSS;
	},0);
},false);

var filter_list = document.getElementById('filter_list');
var filter_text = document.getElementById('filter_text');
var filter_type = document.getElementById('filter_type');
var add_filter = document.getElementById('add_filter');
AutoPatchWork.disable_sites.forEach(create_filter);
function create_filter(site) {
	var li = document.createElement('li');
	var types = filter_type.cloneNode(true);
	types.id = '';
	li.appendChild(types);
	types.value = site.type;
	types.addEventListener('change',function(){
		site.type = types.value;
		AutoPatchWork.save_disable_site();
	},false);
	var input = document.createElement('input');
	input.type = 'text';
	input.value = site.matcher;
	input.addEventListener('input',function(){
		site.matcher = input.value;
		AutoPatchWork.save_disable_site();
	},false);
	li.appendChild(input);
	var del = document.createElement('button');
	del.textContent = i18n.getMessage('del') || 'Del';
	del.addEventListener('click',function(){
		input.disabled = !input.disabled;
		if (input.disabled) {
			AutoPatchWork.delete_disable_site(site);
			del.textContent = i18n.getMessage('undo') || 'Undo';
		} else {
			AutoPatchWork.add_disable_site(site);
			del.textContent = i18n.getMessage('del') || 'Del';
		}
	},false);
	li.appendChild(del);
	filter_list.appendChild(li);
}
add_filter.addEventListener('click',function(){
	var site = filter_text.value;
	if (!site) return;
	var type = filter_type.value;
	if (type === 'regexp'){
		try {
			new RegExp(site);
		} catch (e) {
			return;
		}
	}
	site = {matcher:site,type:type};
	create_filter(site);
	AutoPatchWork.add_disable_site(site);
	filter_text.value ='';
},false);


var sections = $X('/html/body/div/div/section[contains(@class, "content")]');
var inner_container = document.getElementById('inner_container');
var container = document.getElementById('container');
inner_container.style.width = sections.length * (WIDTH+20) + 'px';
//inner_container.style.height = HEIGHT + 'px';
//container.style.height = HEIGHT + 'px';
container.style.marginTop = '-2px';
sections.forEach(function(section, _i){
	section.style.visibility = 'hidden';
	section.style.height = '100px';
});
var btns = $X('id("menu_tabs")/li/a');
var default_title = document.title;
btns.forEach(function(btn, i, btns){
	btn.addEventListener('click',function(evt){
		evt.preventDefault();
		btns.forEach(function(btn){btn.className = '';})
		btn.className = 'active';
		sections[i].style.visibility = 'visible';
		sections[i].style.height = 'auto';
		new Tween(inner_container.style, {marginLeft:{to:i * -WIDTH,tmpl:'$#px'},time:0.2,onComplete:function(){
				document.title = default_title + btn.hash;
				!window.opera && (location.hash = btn.hash);
				window.scrollBy(0, -1000);
				sections.forEach(function(section, _i){
					if (i !== _i) {
						section.style.visibility = 'hidden';
						section.style.height = '100px';
					}
				});
			}});
	}, false);
});
if (location.hash) {
	sections.some(function(section, i){
		if ('#' + section.id === location.hash) {
			btns.forEach(function(btn){btn.className = '';})
			btns[i].className = 'active';
			inner_container.style.marginLeft = -WIDTH * i + 'px';
			section.style.visibility = 'visible';
			section.style.height = 'auto';
			document.title = default_title + location.hash;
		}
	});
} else {
	sections[0].style.height = 'auto';
	sections[0].style.visibility = 'visible';
	document.title = default_title + '#' + sections[0].id;
}
})();
</script>
</body>
</html>
